/**
 * 时钟池，当启动时钟时，TIM2 TIM3 或 TIM4 哪个空闲就选哪个
 */
#ifndef __TIMER
#define __TIMER

#include "config.h"

typedef struct _Timer Timer;
#define TIMER(any) ((Timer *)(any))

#ifndef __OBJ_HANDLER__
        #define __OBJ_HANDLER__
typedef void (*ObjectIRQHandler)(void *object);
        #define OBJECT_IRQ_HANDLER(any) ((ObjectIRQHandler)(any))
#endif

/* 时钟原子 */
typedef struct _ClockAtomic ClockAtomic;

/**
 * 时钟类，可以被继承使用
 */
struct _Timer
{
        ClockAtomic     *tim_atomic;
        ObjectIRQHandler handler_cb;
        uint16_t         psc;
        uint16_t         arr;
        bool             is_started;
};

extern void
timer_init(Timer *self, ObjectIRQHandler handler, uint16_t psc, uint16_t arr);

/**
 * @brief 启用时钟
 */
extern void timer_start(Timer *self);

/**
 * @brief 停止时钟
 */
extern void timer_stop(Timer *self);

/**
 * @brief 调整计时，中断时间 = psc * arr / 72MHz
 * @param psc 预分频系数
 * @param arr 自动重载值
 */
extern void timer_set_psc_arr(Timer *self, uint16_t psc, uint16_t arr);

/**
 * Debug 功能，获取正在使用的时钟原子个数
 * @return 正在使用的时钟原子个数
 */
extern uint8_t timer_get_used(void);

#endif
